/**
 * 路由配置文件
 *
 * @file frontend/src/routes/index.tsx
 * @description 应用的所有路由配置，使用 React Router v6 的 RouteObject 类型
 * @author 类小脑计算平台开发团队
 * @date 2025-11-15
 *
 * 架构说明：
 * - 使用 React.lazy 实现路由懒加载，提升首屏加载速度
 * - 路由分为三大类：主要页面路由、兼容性路由、Frame 路由
 * - 所有路由配置集中管理，便于维护和扩展
 *
 * 使用方式：
 * ```tsx
 * import { useRoutes } from 'react-router-dom';
 * import routes from './routes';
 *
 * const App = () => {
 *   const element = useRoutes(routes);
 *   return <div>{element}</div>;
 * };
 * ```
 */

import React, { lazy, Suspense } from 'react';
import { RouteObject, Navigate } from 'react-router-dom';

// ============================================================================
// 页面组件懒加载
// ============================================================================
// 使用 React.lazy 实现代码分割，按需加载页面组件，减少初始包体积

/**
 * 欢迎页面
 * @path /
 * @description 应用首页，展示系统功能入口
 */
const Welcome = lazy(() => import('../pages/Welcome'));

/**
 * 细胞类型配置页面（主配置页）
 * @path /cell-config
 * @description 对应设计图 Frame 8，细胞类型的主要配置界面
 */
const Main = lazy(() => import('../pages/Main'));

/**
 * NetPyNE 主组件
 * @path /netpyne
 * @description NetPyNE 核心组件页面，神经网络建模主界面
 */
const NetPyNE = lazy(() => import('../components/NetPyNE/NetPyNE'));

/**
 * 细胞类型配置页面（备用）
 * @path 未使用
 * @description 细胞类型配置的备用组件
 */
const CellTypeConfig = lazy(() => import('../pages/CellTypeConfig'));

// ----------------------------------------------------------------------------
// 仿真配置页面
// ----------------------------------------------------------------------------

/**
 * 仿真配置 - 通用设置
 * @path /simulation-config-general
 * @description 对应设计图 Frame 10，仿真的通用配置参数
 */
const SimulationConfigGeneral = lazy(() => import('../pages/SimulationConfigGeneral'));

/**
 * 仿真配置 - 记录设置
 * @path /simulation-config-record
 * @description 对应设计图 Frame 18，配置仿真数据记录参数
 */
const SimulationConfigRecord = lazy(() => import('../pages/SimulationConfigRecord'));

/**
 * 仿真配置 - 网络设置
 * @path /simulation-config-network
 * @description 对应设计图 Frame 19，配置网络属性参数
 */
const SimulationConfigNetwork = lazy(() => import('../pages/SimulationConfigNetwork'));

/**
 * 仿真配置 - 网络设置 V2
 * @path /simulation-config-network-v2
 * @description 对应设计图 Frame 21，网络配置的第二版本
 */
const SimulationConfigNetworkV2 = lazy(() => import('../pages/SimulationConfigNetworkV2'));

/**
 * 仿真配置 - 网络编辑器
 * @path /simulation-config-network-editor
 * @description 对应设计图 Frame 24，可视化网络编辑器
 */
const SimulationConfigNetworkEditor = lazy(() => import('../pages/SimulationConfigNetworkEditor'));

/**
 * 仿真配置 - 保存设置
 * @path /simulation-config-save
 * @description 对应设计图 Frame 20，配置仿真结果保存参数
 */
const SimulationConfigSave = lazy(() => import('../pages/SimulationConfigSave'));

/**
 * 仿真配置 - 保存设置 V2
 * @path /simulation-config-save-v2
 * @description 对应设计图 Frame 22，保存配置的第二版本
 */
const SimulationConfigSaveV2 = lazy(() => import('../pages/SimulationConfigSaveV2'));

// ----------------------------------------------------------------------------
// 绘图设置页面
// ----------------------------------------------------------------------------

/**
 * 绘图设置 - 光栅图
 * @path /plot-settings-raster
 * @description 对应设计图 Frame 13，配置神经元尖峰光栅图
 */
const PlotSettingsRaster = lazy(() => import('../pages/PlotSettingsRaster'));

/**
 * 绘图设置 - 轨迹图
 * @path /plot-settings-trajectory
 * @description 对应设计图 Frame 14，配置电压轨迹图
 */
const PlotSettingsTrajectory = lazy(() => import('../pages/PlotSettingsTrajectory'));

/**
 * 绘图设置 - 局部场电位（LFP）
 * @path /plot-settings-lfp
 * @description 对应设计图 Frame 16，配置局部场电位图
 */
const PlotSettingsLFP = lazy(() => import('../pages/PlotSettingsLFP'));

// ----------------------------------------------------------------------------
// 反应扩散页面
// ----------------------------------------------------------------------------

/**
 * 反应扩散 - 区域配置
 * @path /reaction-diffusion-region
 * @description 对应设计图 Frame 15，配置反应扩散区域参数
 */
const ReactionDiffusionRegion = lazy(() => import('../pages/ReactionDiffusionRegion'));

/**
 * 反应扩散 - 空状态
 * @path /reaction-diffusion-empty
 * @description 对应设计图 Frame 17，反应扩散的空状态页面
 */
const ReactionDiffusionEmpty = lazy(() => import('../pages/ReactionDiffusionEmpty'));

// ----------------------------------------------------------------------------
// 导入功能页面
// ----------------------------------------------------------------------------

/**
 * 导入 NeuroML 对话框
 * @path /import-neuroml
 * @description 对应设计图 Frame 23，导入 NeuroML 格式文件
 */
const ImportNeuroML = lazy(() => import('../pages/ImportNeuroML'));

/**
 * 导入 Python 对话框
 * @path /import-python
 * @description 对应设计图 Frame 31，导入 Python 脚本文件
 */
const ImportPythonDialog = lazy(() => import('../pages/ImportPythonDialog'));

// ----------------------------------------------------------------------------
// 实验管理页面
// ----------------------------------------------------------------------------

/**
 * 实验管理器
 * @path /experiment-manager
 * @description 对应设计图 Frame 25，管理和组织实验
 */
const ExperimentManager = lazy(() => import('../pages/ExperimentManager'));

// ----------------------------------------------------------------------------
// 对话框页面
// ----------------------------------------------------------------------------

/**
 * 选择文件夹对话框
 * @path /select-folder
 * @description 对应设计图 Frame 26，文件夹选择对话框
 */
const SelectFolderDialog = lazy(() => import('../pages/SelectFolderDialog'));

/**
 * 打开 JSON 对话框
 * @path /open-json
 * @description 对应设计图 Frame 27，打开 JSON 文件对话框
 */
const OpenJSONDialog = lazy(() => import('../pages/OpenJSONDialog'));

/**
 * 保存 JSON 对话框
 * @path /save-json
 * @description 对应设计图 Frame 28，保存 JSON 文件对话框
 */
const SaveJSONDialog = lazy(() => import('../pages/SaveJSONDialog'));

/**
 * 删除确认对话框
 * @path /delete-confirm
 * @description 对应设计图 Frame 29，删除操作确认对话框
 */
const DeleteConfirmDialog = lazy(() => import('../pages/DeleteConfirmDialog'));

/**
 * 保存 JSON 选项对话框
 * @path /save-json-options
 * @description 对应设计图 Frame 30，保存 JSON 文件的选项配置
 */
const SaveJSONDialogOptions = lazy(() => import('../pages/SaveJSONDialogOptions'));

// ----------------------------------------------------------------------------
// 模型定义页面（数据驱动组件）
// ----------------------------------------------------------------------------

/**
 * 群体配置页面
 * @path /populations
 * @description 配置神经元群体参数，数据驱动组件
 */
const Populations = lazy(() => import('../pages/Populations'));

/**
 * 突触机制页面
 * @path /syn-mechs
 * @description 配置突触机制参数，数据驱动组件
 */
const SynMechs = lazy(() => import('../pages/SynMechs'));

/**
 * 连接规则页面
 * @path /conn-rules
 * @description 配置神经元连接规则，数据驱动组件
 */
const ConnRules = lazy(() => import('../pages/ConnRules'));

/**
 * 亚细胞连接规则页面
 * @path /subcell-conn-rules
 * @description 配置亚细胞级别的连接规则，数据驱动组件
 */
const SubcellConnRules = lazy(() => import('../pages/SubcellConnRules'));

/**
 * 刺激源页面
 * @path /stim-sources
 * @description 配置刺激源参数，数据驱动组件
 */
const StimSources = lazy(() => import('../pages/StimSources'));

/**
 * 刺激目标页面
 * @path /stim-targets
 * @description 配置刺激目标参数，数据驱动组件
 */
const StimTargets = lazy(() => import('../pages/StimTargets'));

// ----------------------------------------------------------------------------
// 测试和开发页面
// ----------------------------------------------------------------------------

/**
 * Geppetto 测试页面
 * @path /geppetto-test
 * @description WebSocket 连接测试页面，用于测试 Geppetto 前后端通信
 */
const GeppettoTest = lazy(() => import('../pages/GeppettoTest'));

// ============================================================================
// 加载中组件
// ============================================================================

/**
 * 路由懒加载时的加载中组件
 * @description 在页面组件加载时显示的占位符
 */
const LoadingFallback: React.FC = () => (
  <div style={{
    display: 'flex',
    justifyContent: 'center',
    alignItems: 'center',
    height: '100vh',
    fontSize: '18px',
    color: '#666'
  }}>
    加载中...
  </div>
);

/**
 * 包装懒加载组件的 Suspense
 * @param element 懒加载的组件元素
 * @returns 包装后的组件
 */
const withSuspense = (element: React.ReactElement) => (
  <Suspense fallback={<LoadingFallback />}>
    {element}
  </Suspense>
);

// ============================================================================
// 路由配置
// ============================================================================

/**
 * 主要页面路由配置
 * @description 应用的核心功能页面路由，共 30 个
 *
 * 分类：
 * - 首页和主配置（2个）
 * - 模型定义（6个）
 * - 仿真配置（7个）
 * - 绘图设置（3个）
 * - 反应扩散（2个）
 * - 导入功能（2个）
 * - 实验管理（1个）
 * - 对话框（5个）
 * - 特殊页面（2个）
 */
const mainRoutes: RouteObject[] = [
  // --------------------------------------------------------------------------
  // 首页和主配置
  // --------------------------------------------------------------------------

  {
    path: '/',
    element: withSuspense(<Welcome />),
  },
  {
    path: '/cell-config',
    element: withSuspense(<Main />),
  },

  // --------------------------------------------------------------------------
  // 模型定义（数据驱动组件）
  // --------------------------------------------------------------------------

  {
    path: '/populations',
    element: withSuspense(<Populations />),
  },
  {
    path: '/syn-mechs',
    element: withSuspense(<SynMechs />),
  },
  {
    path: '/conn-rules',
    element: withSuspense(<ConnRules />),
  },
  {
    path: '/subcell-conn-rules',
    element: withSuspense(<SubcellConnRules />),
  },
  {
    path: '/stim-sources',
    element: withSuspense(<StimSources />),
  },
  {
    path: '/stim-targets',
    element: withSuspense(<StimTargets />),
  },

  // --------------------------------------------------------------------------
  // 仿真配置
  // --------------------------------------------------------------------------

  {
    path: '/simulation-config-general',
    element: withSuspense(<SimulationConfigGeneral />),
  },
  {
    path: '/simulation-config-record',
    element: withSuspense(<SimulationConfigRecord />),
  },
  {
    path: '/simulation-config-network',
    element: withSuspense(<SimulationConfigNetwork />),
  },
  {
    path: '/simulation-config-network-v2',
    element: withSuspense(<SimulationConfigNetworkV2 />),
  },
  {
    path: '/simulation-config-network-editor',
    element: withSuspense(<SimulationConfigNetworkEditor />),
  },
  {
    path: '/simulation-config-save',
    element: withSuspense(<SimulationConfigSave />),
  },
  {
    path: '/simulation-config-save-v2',
    element: withSuspense(<SimulationConfigSaveV2 />),
  },

  // --------------------------------------------------------------------------
  // 绘图设置
  // --------------------------------------------------------------------------

  {
    path: '/plot-settings-raster',
    element: withSuspense(<PlotSettingsRaster />),
  },
  {
    path: '/plot-settings-trajectory',
    element: withSuspense(<PlotSettingsTrajectory />),
  },
  {
    path: '/plot-settings-lfp',
    element: withSuspense(<PlotSettingsLFP />),
  },

  // --------------------------------------------------------------------------
  // 反应扩散
  // --------------------------------------------------------------------------

  {
    path: '/reaction-diffusion-region',
    element: withSuspense(<ReactionDiffusionRegion />),
  },
  {
    path: '/reaction-diffusion-empty',
    element: withSuspense(<ReactionDiffusionEmpty />),
  },

  // --------------------------------------------------------------------------
  // 导入功能
  // --------------------------------------------------------------------------

  {
    path: '/import-neuroml',
    element: withSuspense(<ImportNeuroML />),
  },
  {
    path: '/import-python',
    element: withSuspense(<ImportPythonDialog />),
  },

  // --------------------------------------------------------------------------
  // 实验管理
  // --------------------------------------------------------------------------

  {
    path: '/experiment-manager',
    element: withSuspense(<ExperimentManager />),
  },

  // --------------------------------------------------------------------------
  // 对话框
  // --------------------------------------------------------------------------

  {
    path: '/select-folder',
    element: withSuspense(<SelectFolderDialog />),
  },
  {
    path: '/open-json',
    element: withSuspense(<OpenJSONDialog />),
  },
  {
    path: '/save-json',
    element: withSuspense(<SaveJSONDialog />),
  },
  {
    path: '/save-json-options',
    element: withSuspense(<SaveJSONDialogOptions />),
  },
  {
    path: '/delete-confirm',
    element: withSuspense(<DeleteConfirmDialog />),
  },

  // --------------------------------------------------------------------------
  // 特殊页面
  // --------------------------------------------------------------------------

  {
    path: '/netpyne',
    element: withSuspense(<NetPyNE />),
  },
  {
    path: '/geppetto-test',
    element: withSuspense(<GeppettoTest />),
  },
];

/**
 * 兼容性路由配置（历史遗留路径重定向）
 * @description 为了保持向后兼容，将旧版本的路径重定向到新路径，共 7 个
 *
 * 重定向映射：
 * - /synaptic-mechanisms → /syn-mechs
 * - /connectivity-rules → /conn-rules
 * - /subcellular-connectivity → /subcell-conn-rules
 * - /stimulation-sources → /stim-sources
 * - /stimulation-targets → /stim-targets
 * - /plot-settings-traces → /plot-settings-trajectory
 * - /reaction-diffusion-extracellular → /reaction-diffusion-empty
 *
 * 注意：使用 replace 属性避免在浏览器历史记录中留下重定向记录
 */
const legacyRoutes: RouteObject[] = [
  {
    path: '/synaptic-mechanisms',
    element: <Navigate to="/syn-mechs" replace />,
  },
  {
    path: '/connectivity-rules',
    element: <Navigate to="/conn-rules" replace />,
  },
  {
    path: '/subcellular-connectivity',
    element: <Navigate to="/subcell-conn-rules" replace />,
  },
  {
    path: '/stimulation-sources',
    element: <Navigate to="/stim-sources" replace />,
  },
  {
    path: '/stimulation-targets',
    element: <Navigate to="/stim-targets" replace />,
  },
  {
    path: '/plot-settings-traces',
    element: <Navigate to="/plot-settings-trajectory" replace />,
  },
  {
    path: '/reaction-diffusion-extracellular',
    element: <Navigate to="/reaction-diffusion-empty" replace />,
  },
];

/**
 * Frame 编号路径重定向路由
 * @description 通过设计图编号访问对应页面，方便开发和测试，共 21 个
 *
 * Frame 编号对应关系：
 * - Frame 8  → /cell-config (细胞类型配置)
 * - Frame 10 → /simulation-config-general (仿真配置-通用)
 * - Frame 13 → /plot-settings-raster (绘图设置-光栅图)
 * - Frame 14 → /plot-settings-trajectory (绘图设置-轨迹图)
 * - Frame 15 → /reaction-diffusion-region (反应扩散-区域)
 * - Frame 16 → /plot-settings-lfp (绘图设置-LFP)
 * - Frame 17 → /reaction-diffusion-empty (反应扩散-空状态)
 * - Frame 18 → /simulation-config-record (仿真配置-记录)
 * - Frame 19 → /simulation-config-network (仿真配置-网络)
 * - Frame 20 → /simulation-config-save (仿真配置-保存)
 * - Frame 21 → /simulation-config-network-v2 (仿真配置-网络V2)
 * - Frame 22 → /simulation-config-save-v2 (仿真配置-保存V2)
 * - Frame 23 → /import-neuroml (导入NeuroML)
 * - Frame 24 → /simulation-config-network-editor (仿真配置-网络编辑器)
 * - Frame 25 → /experiment-manager (实验管理器)
 * - Frame 26 → /select-folder (选择文件夹对话框)
 * - Frame 27 → /open-json (打开JSON对话框)
 * - Frame 28 → /save-json (保存JSON对话框)
 * - Frame 29 → /delete-confirm (删除确认对话框)
 * - Frame 30 → /save-json-options (保存JSON选项对话框)
 * - Frame 31 → /import-python (导入Python对话框)
 *
 * 使用示例：
 * - 访问 http://localhost:8081/frame/8 会自动跳转到 /cell-config
 * - 访问 http://localhost:8081/frame/25 会自动跳转到 /experiment-manager
 *
 * 注意：Frame 9, 11, 12 的设计图不存在，可能在设计阶段被合并或删除
 */
const frameRoutes: RouteObject[] = [
  // Frame 8 - 细胞类型配置
  {
    path: '/frame/8',
    element: <Navigate to="/cell-config" replace />,
  },
  // Frame 10 - 仿真配置-通用
  {
    path: '/frame/10',
    element: <Navigate to="/simulation-config-general" replace />,
  },
  // Frame 13 - 绘图设置-光栅图
  {
    path: '/frame/13',
    element: <Navigate to="/plot-settings-raster" replace />,
  },
  // Frame 14 - 绘图设置-轨迹图
  {
    path: '/frame/14',
    element: <Navigate to="/plot-settings-trajectory" replace />,
  },
  // Frame 15 - 反应扩散-区域
  {
    path: '/frame/15',
    element: <Navigate to="/reaction-diffusion-region" replace />,
  },
  // Frame 16 - 绘图设置-LFP
  {
    path: '/frame/16',
    element: <Navigate to="/plot-settings-lfp" replace />,
  },
  // Frame 17 - 反应扩散-空状态
  {
    path: '/frame/17',
    element: <Navigate to="/reaction-diffusion-empty" replace />,
  },
  // Frame 18 - 仿真配置-记录
  {
    path: '/frame/18',
    element: <Navigate to="/simulation-config-record" replace />,
  },
  // Frame 19 - 仿真配置-网络
  {
    path: '/frame/19',
    element: <Navigate to="/simulation-config-network" replace />,
  },
  // Frame 20 - 仿真配置-保存
  {
    path: '/frame/20',
    element: <Navigate to="/simulation-config-save" replace />,
  },
  // Frame 21 - 仿真配置-网络V2
  {
    path: '/frame/21',
    element: <Navigate to="/simulation-config-network-v2" replace />,
  },
  // Frame 22 - 仿真配置-保存V2
  {
    path: '/frame/22',
    element: <Navigate to="/simulation-config-save-v2" replace />,
  },
  // Frame 23 - 导入NeuroML
  {
    path: '/frame/23',
    element: <Navigate to="/import-neuroml" replace />,
  },
  // Frame 24 - 仿真配置-网络编辑器
  {
    path: '/frame/24',
    element: <Navigate to="/simulation-config-network-editor" replace />,
  },
  // Frame 25 - 实验管理器
  {
    path: '/frame/25',
    element: <Navigate to="/experiment-manager" replace />,
  },
  // Frame 26 - 选择文件夹对话框
  {
    path: '/frame/26',
    element: <Navigate to="/select-folder" replace />,
  },
  // Frame 27 - 打开JSON对话框
  {
    path: '/frame/27',
    element: <Navigate to="/open-json" replace />,
  },
  // Frame 28 - 保存JSON对话框
  {
    path: '/frame/28',
    element: <Navigate to="/save-json" replace />,
  },
  // Frame 29 - 删除确认对话框
  {
    path: '/frame/29',
    element: <Navigate to="/delete-confirm" replace />,
  },
  // Frame 30 - 保存JSON选项对话框
  {
    path: '/frame/30',
    element: <Navigate to="/save-json-options" replace />,
  },
  // Frame 31 - 导入Python对话框
  {
    path: '/frame/31',
    element: <Navigate to="/import-python" replace />,
  },
];

// ============================================================================
// 路由导出
// ============================================================================

/**
 * 应用的完整路由配置
 * @description 合并所有路由配置（主要路由 + 兼容性路由 + Frame 路由）
 *
 * 路由统计：
 * - 主要页面路由：30 个
 * - 兼容性路由：7 个
 * - Frame 路由：21 个
 * - 总计：58 个路由
 *
 * 使用方式：
 * ```tsx
 * import { useRoutes } from 'react-router-dom';
 * import routes from './routes';
 *
 * const App = () => {
 *   const element = useRoutes(routes);
 *   return <div>{element}</div>;
 * };
 * ```
 *
 * 路由优先级：
 * 1. 主要路由优先匹配
 * 2. 兼容性路由次之
 * 3. Frame 路由最后
 *
 * 注意事项：
 * - 所有路由都使用懒加载，提升首屏加载速度
 * - 重定向路由使用 replace 属性，避免历史记录堆积
 * - 加载中状态使用统一的 LoadingFallback 组件
 */
const routes: RouteObject[] = [
  ...mainRoutes,      // 主要页面路由（30个）
  ...legacyRoutes,    // 兼容性路由（7个）
  ...frameRoutes,     // Frame 路由（21个）
];

/**
 * 默认导出路由配置
 * @exports routes
 */
export default routes;

/**
 * 导出路由分类（用于调试和文档）
 * @exports mainRoutes - 主要页面路由
 * @exports legacyRoutes - 兼容性路由
 * @exports frameRoutes - Frame 路由
 */
export {
  mainRoutes,
  legacyRoutes,
  frameRoutes,
};

